composetable: Allow multiple dead keys
authorMatthias Clasen <mclasen@redhat.com>
Thu, 29 Jul 2021 20:36:25 +0000 (16:36 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 30 Jul 2021 00:37:30 +0000 (20:37 -0400)
Remove the limitation on the number of dead keys
that we match, and allow the result be be multiple
characters.

Regenerate the builtin sequences, since this changes
what dead key sequences we can reproduce algorithmically.

Update tests to match.

Fixes: #10
gtk/compose/chars
gtk/compose/gtkcomposedata.h
gtk/compose/sequences
gtk/gtkcomposetable.c
testsuite/gtk/compose/system.expected
testsuite/gtk/composetable.c

index 9f9b15314f235cd2b0a39e90163a64fd8a8c8fa2..f3897230eaebecae7342d4bcca93fc09f4a927ea 100644 (file)
Binary files a/gtk/compose/chars and b/gtk/compose/chars differ
index 057347a36bb8bd7f15552e335a459f2ed73f1adf..442696218c2b600b944d82dcdc2ebcd420124865 100644 (file)
@@ -3,7 +3,7 @@
 
 #define MAX_SEQ_LEN 5
 #define N_INDEX_SIZE 30
-#define DATA_SIZE 16521
-#define N_CHARS 1572
+#define DATA_SIZE 16447
+#define N_CHARS 1241
 
 #endif
index 1db7a6cddb6895e0db17ad77905b2e70ddd86065..39984d41250016d2639202f9a458aa1e96dc092f 100644 (file)
Binary files a/gtk/compose/sequences and b/gtk/compose/sequences differ
index ef8d01266ab876b195166636e5d0128606de3e01..464bf1876aaece9362576d4e65d6ee66c86bb7b0 100644 (file)
@@ -1462,77 +1462,6 @@ gtk_compose_table_foreach (const GtkComposeTable      *table,
 #define IS_DEAD_KEY(k) \
     ((k) >= GDK_KEY_dead_grave && (k) <= GDK_KEY_dead_greek)
 
-/* This function receives a sequence of Unicode characters and tries to
- * normalize it (NFC). We check for the case where the resulting string
- * has length 1 (single character).
- * NFC normalisation normally rearranges diacritic marks, unless these
- * belong to the same Canonical Combining Class.
- * If they belong to the same canonical combining class, we produce all
- * permutations of the diacritic marks, then attempt to normalize.
- */
-static gboolean
-check_normalize_nfc (gunichar *combination_buffer,
-                     int       n_compose)
-{
-  gunichar *combination_buffer_temp;
-  char *combination_utf8_temp = NULL;
-  char *nfc_temp = NULL;
-  int n_combinations;
-  gunichar temp_swap;
-  int i;
-
-  combination_buffer_temp = g_alloca (n_compose * sizeof (gunichar));
-
-  n_combinations = 1;
-
-  for (i = 1; i < n_compose; i++)
-     n_combinations *= i;
-
-  /* Xorg reuses dead_tilde for the perispomeni diacritic mark.
-   * We check if base character belongs to Greek Unicode block,
-   * and if so, we replace tilde with perispomeni.
-   */
-  if (combination_buffer[0] >= 0x390 && combination_buffer[0] <= 0x3FF)
-    {
-      for (i = 1; i < n_compose; i++ )
-        if (combination_buffer[i] == 0x303)
-          combination_buffer[i] = 0x342;
-    }
-
-  memcpy (combination_buffer_temp, combination_buffer, n_compose * sizeof (gunichar) );
-
-  for (i = 0; i < n_combinations; i++)
-    {
-      g_unicode_canonical_ordering (combination_buffer_temp, n_compose);
-      combination_utf8_temp = g_ucs4_to_utf8 (combination_buffer_temp, n_compose, NULL, NULL, NULL);
-      nfc_temp = g_utf8_normalize (combination_utf8_temp, -1, G_NORMALIZE_NFC);
-
-      if (g_utf8_strlen (nfc_temp, -1) == 1)
-        {
-          memcpy (combination_buffer, combination_buffer_temp, n_compose * sizeof (gunichar) );
-
-          g_free (combination_utf8_temp);
-          g_free (nfc_temp);
-
-          return TRUE;
-        }
-
-      g_free (combination_utf8_temp);
-      g_free (nfc_temp);
-
-      if (n_compose > 2)
-        {
-          temp_swap = combination_buffer_temp[i % (n_compose - 1) + 1];
-          combination_buffer_temp[i % (n_compose - 1) + 1] = combination_buffer_temp[(i+1) % (n_compose - 1) + 1];
-          combination_buffer_temp[(i+1) % (n_compose - 1) + 1] = temp_swap;
-        }
-      else
-        break;
-    }
-
-  return FALSE;
-}
-
 gboolean
 gtk_check_algorithmically (const guint16 *compose_buffer,
                            int            n_compose,
@@ -1540,40 +1469,49 @@ gtk_check_algorithmically (const guint16 *compose_buffer,
 
 {
   int i;
-  gunichar *combination_buffer;
-  char *combination_utf8, *nfc;
-
-  combination_buffer = alloca (sizeof (gunichar) * (n_compose + 1));
 
   g_string_set_size (output, 0);
 
   for (i = 0; i < n_compose && IS_DEAD_KEY (compose_buffer[i]); i++)
     ;
 
-  /* Allow at most 2 dead keys */
-  if (i > 2)
-    return FALSE;
-
-  /* Can't combine if there's no base character */
+  /* Can't combine if there's no base character: incomplete sequence */
   if (i == n_compose)
     return TRUE;
 
   if (i > 0 && i == n_compose - 1)
     {
-      combination_buffer[0] = gdk_keyval_to_unicode (compose_buffer[i]);
-      combination_buffer[n_compose] = 0;
+      GString *input;
+      char *nfc;
+      gunichar ch;
+
+      ch = gdk_keyval_to_unicode (compose_buffer[i]);
+
+      /* We don't allow combining with non-letters */
+      if (!g_unichar_isalpha (ch))
+        return FALSE;
+
+      input = g_string_sized_new (4 * n_compose);
+
+      g_string_append_unichar (input, ch);
+
       i--;
       while (i >= 0)
         {
           switch (compose_buffer[i])
             {
 #define CASE(keysym, unicode) \
-            case GDK_KEY_dead_##keysym: combination_buffer[i+1] = unicode; break
+            case GDK_KEY_dead_##keysym: g_string_append_unichar (input, unicode); break
 
             CASE (grave, 0x0300);
             CASE (acute, 0x0301);
             CASE (circumflex, 0x0302);
-            CASE (tilde, 0x0303);       /* Also used with perispomeni, 0x342. */
+            case GDK_KEY_dead_tilde:
+              if (g_unichar_get_script (ch) == G_UNICODE_SCRIPT_GREEK)
+                g_string_append_unichar (input, 0x342); /* combining perispomeni */
+              else
+                g_string_append_unichar (input, 0x303); /* combining tilde */
+              break;
             CASE (macron, 0x0304);
             CASE (breve, 0x0306);
             CASE (abovedot, 0x0307);
@@ -1591,7 +1529,7 @@ gtk_check_algorithmically (const guint16 *compose_buffer,
             CASE (horn, 0x031B);        /* Legacy use for psili, 0x313 (or 0x343). */
             CASE (stroke, 0x335);
             CASE (abovecomma, 0x0313);  /* Equivalent to psili */
-            CASE (abovereversedcomma, 0x0314); /* Equivalent to dasia */
+            CASE (abovereversedcomma, 0x0314);   /* Equivalent to dasia */
             CASE (doublegrave, 0x30F);
             CASE (belowring, 0x325);
             CASE (belowmacron, 0x331);
@@ -1619,26 +1557,20 @@ gtk_check_algorithmically (const guint16 *compose_buffer,
             CASE (capital_schwa, 0x1DEA);
 #undef CASE
             default:
-              combination_buffer[i+1] = gdk_keyval_to_unicode (compose_buffer[i]);
+              g_string_append_unichar (input, gdk_keyval_to_unicode (compose_buffer[i]));
             }
           i--;
         }
 
-      /* If the buffer normalizes to a single character, then modify the order
-       * of combination_buffer accordingly, if necessary, and return TRUE.
-       */
-      if (check_normalize_nfc (combination_buffer, n_compose))
-        {
-          combination_utf8 = g_ucs4_to_utf8 (combination_buffer, -1, NULL, NULL, NULL);
-          nfc = g_utf8_normalize (combination_utf8, -1, G_NORMALIZE_NFC);
+      nfc = g_utf8_normalize (input->str, input->len, G_NORMALIZE_NFC);
 
-          g_string_assign (output, nfc);
+      g_string_assign (output, nfc);
 
-          g_free (combination_utf8);
-          g_free (nfc);
+      g_free (nfc);
 
-          return TRUE;
-        }
+      g_string_free (input, TRUE);
+
+      return TRUE;
     }
 
   return FALSE;
index aac5ac82eae9597d71e1812fd8d420401b4e3b62..c807827bbf07f6245cb26afd9b132974adef8198 100644 (file)
@@ -1,14 +1,12 @@
-# n_sequences: 4909
+# n_sequences: 4874
 # max_seq_len: 5
 # n_index_size: 30
-# data_size: 16521
-# n_chars: 1572
+# data_size: 16447
+# n_chars: 1241
 <U7ae> <U7e9> : "ΐ" # U390
 <U7ae> <U7f5> : "ΰ" # U3b0
 <Ufe50> <U20> : "`" # U60
-<Ufe50> <U4d> : "M̀"
 <Ufe50> <U56> : "Ǜ" # U1db
-<Ufe50> <U6d> : "m̀"
 <Ufe50> <U76> : "ǜ" # U1dc
 <Ufe50> <Ua0> : "̀" # U300
 <Ufe50> <U186> : "Ɔ̀"
 <Ufe50> <U269> : "ɩ̀"
 <Ufe50> <U28a> : "ʊ̀"
 <Ufe50> <U28b> : "ʋ̀"
-<Ufe50> <U3bd> : "Ŋ̀"
-<Ufe50> <U3bf> : "ŋ̀"
-<Ufe50> <U6c1> : "а̀"
-<Ufe50> <U6cf> : "о̀"
-<Ufe50> <U6d2> : "р̀"
-<Ufe50> <U6d5> : "у̀"
-<Ufe50> <U6e1> : "А̀"
-<Ufe50> <U6ef> : "О̀"
-<Ufe50> <U6f2> : "Р̀"
-<Ufe50> <U6f5> : "У̀"
 <Ufe50> <U1f00> : "ἂ" # U1f02
 <Ufe50> <U1f01> : "ἃ" # U1f03
 <Ufe50> <U1f08> : "Ἂ" # U1f0a
 <Ufe50> <Uff20> <Uaf> <U65> : "ḕ" # U1e15
 <Ufe50> <Uff20> <Uaf> <U6f> : "ṑ" # U1e51
 <Ufe51> <U20> : "'" # U27
-<Ufe51> <U4a> : "J́"
 <Ufe51> <U56> : "Ǘ" # U1d7
-<Ufe51> <U6a> : "j́"
 <Ufe51> <U76> : "ǘ" # U1d8
 <Ufe51> <Ua0> : "́" # U301
 <Ufe51> <U186> : "Ɔ́"
 <Ufe51> <U269> : "ɩ́"
 <Ufe51> <U28a> : "ʊ́"
 <Ufe51> <U28b> : "ʋ́"
-<Ufe51> <U3bd> : "Ŋ́"
-<Ufe51> <U3bf> : "ŋ́"
-<Ufe51> <U6c0> : "ю́"
-<Ufe51> <U6c1> : "а́"
-<Ufe51> <U6c5> : "е́"
-<Ufe51> <U6c9> : "и́"
-<Ufe51> <U6cf> : "о́"
-<Ufe51> <U6d1> : "я́"
-<Ufe51> <U6d2> : "р́"
-<Ufe51> <U6d5> : "у́"
-<Ufe51> <U6d9> : "ы́"
-<Ufe51> <U6dc> : "э́"
 <Ufe51> <U6e0> : "Ю́́"
-<Ufe51> <U6e1> : "А́"
-<Ufe51> <U6e5> : "Е́"
-<Ufe51> <U6e9> : "И́"
-<Ufe51> <U6ef> : "О́"
-<Ufe51> <U6f1> : "Я́"
-<Ufe51> <U6f2> : "Р́"
-<Ufe51> <U6f5> : "У́"
-<Ufe51> <U6f9> : "Ы́"
-<Ufe51> <U6fc> : "Э́"
 <Ufe51> <U1f00> : "ἄ" # U1f04
 <Ufe51> <U1f01> : "ἅ" # U1f05
 <Ufe51> <U1f08> : "Ἄ" # U1f0c
 <Ufe51> <Ufe53> <U1dd> : "ǝ̃́"
 <Ufe51> <Ufe53> <U254> : "ɔ̃́"
 <Ufe51> <Ufe53> <U25b> : "ɛ̃́"
+<Ufe51> <Ufe56> <U53> : "Ṥ" # U1e64
+<Ufe51> <Ufe56> <U73> : "ṥ" # U1e65
 <Ufe51> <Ufe57> <U20> : "΅" # U385
 <Ufe51> <Ufe63> <U4f> : "Ǿ" # U1fe
 <Ufe51> <Ufe63> <U6f> : "ǿ" # U1ff
 <Ufe52> <U269> : "ɩ̂"
 <Ufe52> <U28a> : "ʊ̂"
 <Ufe52> <U28b> : "ʋ̂"
-<Ufe52> <U6c1> : "а̂"
-<Ufe52> <U6c5> : "е̂"
-<Ufe52> <U6c9> : "и̂"
-<Ufe52> <U6cf> : "о̂"
-<Ufe52> <U6d2> : "р̂"
-<Ufe52> <U6d5> : "у̂"
-<Ufe52> <U6e1> : "А̂"
-<Ufe52> <U6e5> : "Е̂"
-<Ufe52> <U6e9> : "И̂"
-<Ufe52> <U6ef> : "О̂"
-<Ufe52> <U6f2> : "Р̂"
-<Ufe52> <U6f5> : "У̂"
 <Ufe52> <U1ea0> : "Ậ" # U1eac
 <Ufe52> <U1ea1> : "ậ" # U1ead
 <Ufe52> <U1eb8> : "Ệ" # U1ec6
 <Ufe52> <Uffb8> : "⁸" # U2078
 <Ufe52> <Uffb9> : "⁹" # U2079
 <Ufe52> <Uffbd> : "⁼" # U207c
+<Ufe52> <Ufe50> <U41> : "Ầ" # U1ea6
+<Ufe52> <Ufe50> <U45> : "Ề" # U1ec0
+<Ufe52> <Ufe50> <U4f> : "Ồ" # U1ed2
+<Ufe52> <Ufe50> <U61> : "ầ" # U1ea7
+<Ufe52> <Ufe50> <U65> : "ề" # U1ec1
+<Ufe52> <Ufe50> <U6f> : "ồ" # U1ed3
+<Ufe52> <Ufe51> <U41> : "Ấ" # U1ea4
+<Ufe52> <Ufe51> <U45> : "Ế" # U1ebe
+<Ufe52> <Ufe51> <U4f> : "Ố" # U1ed0
+<Ufe52> <Ufe51> <U61> : "ấ" # U1ea5
+<Ufe52> <Ufe51> <U65> : "ế" # U1ebf
+<Ufe52> <Ufe51> <U6f> : "ố" # U1ed1
+<Ufe52> <Ufe53> <U41> : "Ẫ" # U1eaa
+<Ufe52> <Ufe53> <U45> : "Ễ" # U1ec4
+<Ufe52> <Ufe53> <U4f> : "Ỗ" # U1ed6
+<Ufe52> <Ufe53> <U61> : "ẫ" # U1eab
+<Ufe52> <Ufe53> <U65> : "ễ" # U1ec5
+<Ufe52> <Ufe53> <U6f> : "ỗ" # U1ed7
+<Ufe52> <Ufe61> <U41> : "Ẩ" # U1ea8
+<Ufe52> <Ufe61> <U45> : "Ể" # U1ec2
+<Ufe52> <Ufe61> <U4f> : "Ổ" # U1ed4
+<Ufe52> <Ufe61> <U61> : "ẩ" # U1ea9
+<Ufe52> <Ufe61> <U65> : "ể" # U1ec3
+<Ufe52> <Ufe61> <U6f> : "ổ" # U1ed5
 <Ufe52> <Uff20> <U21> <U41> : "Ậ" # U1eac
 <Ufe52> <Uff20> <U21> <U45> : "Ệ" # U1ec6
 <Ufe52> <Uff20> <U21> <U4f> : "Ộ" # U1ed8
 <Ufe53> <U1f68> : "Ὦ" # U1f6e
 <Ufe53> <U1f69> : "Ὧ" # U1f6f
 <Ufe53> <Ufe53> : "~" # U7e
+<Ufe53> <Ufe51> <U4f> : "Ṍ" # U1e4c
+<Ufe53> <Ufe51> <U55> : "Ṹ" # U1e78
+<Ufe53> <Ufe51> <U6f> : "ṍ" # U1e4d
+<Ufe53> <Ufe51> <U75> : "ṹ" # U1e79
+<Ufe53> <Ufe54> <U4f> : "Ȭ" # U22c
+<Ufe53> <Ufe54> <U6f> : "ȭ" # U22d
+<Ufe53> <Ufe57> <U4f> : "Ṏ" # U1e4e
+<Ufe53> <Ufe57> <U6f> : "ṏ" # U1e4f
 <Ufe53> <Uff20> <U22> <U7e9> : "ῗ" # U1fd7
 <Ufe53> <Uff20> <U22> <U7f5> : "ῧ" # U1fe7
 <Ufe53> <Uff20> <U28> <U7c1> : "Ἇ" # U1f0f
 <Ufe54> <U269> : "ɩ̄"
 <Ufe54> <U28a> : "ʊ̄"
 <Ufe54> <U28b> : "ʋ̄"
-<Ufe54> <U6c1> : "а̄"
-<Ufe54> <U6c5> : "е̄"
-<Ufe54> <U6cf> : "о̄"
-<Ufe54> <U6d2> : "р̄"
-<Ufe54> <U6e1> : "А̄"
-<Ufe54> <U6e5> : "Е̄"
-<Ufe54> <U6ef> : "О̄"
-<Ufe54> <U6f2> : "Р̄"
 <Ufe54> <U1e36> : "Ḹ" # U1e38
 <Ufe54> <U1e37> : "ḹ" # U1e39
 <Ufe54> <U1e5a> : "Ṝ" # U1e5c
 <Ufe54> <U1e5b> : "ṝ" # U1e5d
 <Ufe54> <Ufe54> : "¯" # Uaf
-<Ufe54> <Ufe57> <U55> : "Ǖ" # U1d5
-<Ufe54> <Ufe57> <U75> : "ǖ" # U1d6
+<Ufe54> <Ufe50> <U45> : "Ḕ" # U1e14
+<Ufe54> <Ufe50> <U4f> : "Ṑ" # U1e50
+<Ufe54> <Ufe50> <U65> : "ḕ" # U1e15
+<Ufe54> <Ufe50> <U6f> : "ṑ" # U1e51
+<Ufe54> <Ufe51> <U45> : "Ḗ" # U1e16
+<Ufe54> <Ufe51> <U4f> : "Ṓ" # U1e52
+<Ufe54> <Ufe51> <U65> : "ḗ" # U1e17
+<Ufe54> <Ufe51> <U6f> : "ṓ" # U1e53
 <Ufe54> <Ufe8c> <U41> : "Ᾱ" # U1fb9
 <Ufe54> <Ufe8c> <U49> : "Ῑ" # U1fd9
 <Ufe54> <Ufe8c> <U55> : "Ῡ" # U1fe9
 <Ufe55> <U1ea0> : "Ặ" # U1eb6
 <Ufe55> <U1ea1> : "ặ" # U1eb7
 <Ufe55> <Ufe55> : "˘" # U2d8
+<Ufe55> <Ufe50> <U41> : "Ằ" # U1eb0
+<Ufe55> <Ufe50> <U61> : "ằ" # U1eb1
+<Ufe55> <Ufe51> <U41> : "Ắ" # U1eae
+<Ufe55> <Ufe51> <U61> : "ắ" # U1eaf
+<Ufe55> <Ufe53> <U41> : "Ẵ" # U1eb4
+<Ufe55> <Ufe53> <U61> : "ẵ" # U1eb5
+<Ufe55> <Ufe61> <U41> : "Ẳ" # U1eb2
+<Ufe55> <Ufe61> <U61> : "ẳ" # U1eb3
 <Ufe55> <Uff20> <U21> <U41> : "Ặ" # U1eb6
 <Ufe55> <Uff20> <U21> <U61> : "ặ" # U1eb7
 <Ufe55> <Uff20> <U2c> <U45> : "Ḝ" # U1e1c
 <Ufe56> <U1e62> : "Ṩ" # U1e68
 <Ufe56> <U1e63> : "ṩ" # U1e69
 <Ufe56> <Ufe56> : "˙" # U2d9
+<Ufe56> <Ufe54> <U41> : "Ǡ" # U1e0
+<Ufe56> <Ufe54> <U4f> : "Ȱ" # U230
+<Ufe56> <Ufe54> <U61> : "ǡ" # U1e1
+<Ufe56> <Ufe54> <U6f> : "ȱ" # U231
 <Ufe56> <Ufe63> <U6a> : "ɟ" # U25f
 <Ufe56> <Uff20> <U21> <U53> : "Ṩ" # U1e68
 <Ufe56> <Uff20> <U21> <U73> : "ṩ" # U1e69
 <Ufe57> <U4e8> : "Ӫ" # U4ea
 <Ufe57> <U4e9> : "ӫ" # U4eb
 <Ufe57> <Ufe57> : "¨" # Ua8
+<Ufe57> <Ufe50> <U55> : "Ǜ" # U1db
+<Ufe57> <Ufe50> <U75> : "ǜ" # U1dc
 <Ufe57> <Ufe51> <U20> : "΅" # U385
-<Ufe57> <Ufe54> <U55> : "Ṻ" # U1e7a
-<Ufe57> <Ufe54> <U75> : "ṻ" # U1e7b
+<Ufe57> <Ufe51> <U49> : "Ḯ" # U1e2e
+<Ufe57> <Ufe51> <U55> : "Ǘ" # U1d7
+<Ufe57> <Ufe51> <U69> : "ḯ" # U1e2f
+<Ufe57> <Ufe51> <U75> : "ǘ" # U1d8
+<Ufe57> <Ufe51> <U7e9> : "ΐ" # U390
+<Ufe57> <Ufe51> <U7f5> : "ΰ" # U3b0
+<Ufe57> <Ufe54> <U41> : "Ǟ" # U1de
+<Ufe57> <Ufe54> <U4f> : "Ȫ" # U22a
+<Ufe57> <Ufe54> <U61> : "ǟ" # U1df
+<Ufe57> <Ufe54> <U6f> : "ȫ" # U22b
+<Ufe57> <Ufe5a> <U55> : "Ǚ" # U1d9
+<Ufe57> <Ufe5a> <U75> : "ǚ" # U1da
 <Ufe57> <Ufe6c> <U3d> : "⩷" # U2a77
 <Ufe57> <Uff20> <U5f> <U55> : "Ṻ" # U1e7a
 <Ufe57> <Uff20> <U5f> <U75> : "ṻ" # U1e7b
 <Ufe58> <Uc1> : "Ǻ" # U1fa
 <Ufe58> <Ue1> : "ǻ" # U1fb
 <Ufe58> <Ufe58> : "°" # Ub0
+<Ufe58> <Ufe51> <U41> : "Ǻ" # U1fa
+<Ufe58> <Ufe51> <U61> : "ǻ" # U1fb
 <Ufe59> <U20> : "˝" # U2dd
 <Ufe59> <Ua0> : "̋" # U30b
 <Ufe59> <Ufe59> : "˝" # U2dd
 <Ufe5a> <U28a> : "ʊ̌"
 <Ufe5a> <U28b> : "ʋ̌"
 <Ufe5a> <Ufe5a> : "ˇ" # U2c7
+<Ufe5a> <Ufe56> <U53> : "Ṧ" # U1e66
+<Ufe5a> <Ufe56> <U73> : "ṧ" # U1e67
 <Ufe5a> <Uff20> <U22> <U55> : "Ǚ" # U1d9
 <Ufe5a> <Uff20> <U22> <U75> : "ǚ" # U1da
 <Ufe5b> <U20> : "¸" # Ub8
 <Ufe5d> <Ufe53> <U1f61> : "ᾧ" # U1fa7
 <Ufe5d> <Ufe53> <U1f68> : "ᾮ" # U1fae
 <Ufe5d> <Ufe53> <U1f69> : "ᾯ" # U1faf
-<Ufe5d> <Ufe50> <Ufe64> <U7c1> : "ᾊ" # U1f8a
-<Ufe5d> <Ufe50> <Ufe64> <U7c7> : "ᾚ" # U1f9a
-<Ufe5d> <Ufe50> <Ufe64> <U7d9> : "ᾪ" # U1faa
-<Ufe5d> <Ufe50> <Ufe64> <U7e1> : "ᾂ" # U1f82
-<Ufe5d> <Ufe50> <Ufe64> <U7e7> : "ᾒ" # U1f92
-<Ufe5d> <Ufe50> <Ufe64> <U7f9> : "ᾢ" # U1fa2
-<Ufe5d> <Ufe50> <Ufe65> <U7c1> : "ᾋ" # U1f8b
-<Ufe5d> <Ufe50> <Ufe65> <U7c7> : "ᾛ" # U1f9b
-<Ufe5d> <Ufe50> <Ufe65> <U7d9> : "ᾫ" # U1fab
-<Ufe5d> <Ufe50> <Ufe65> <U7e1> : "ᾃ" # U1f83
-<Ufe5d> <Ufe50> <Ufe65> <U7e7> : "ᾓ" # U1f93
-<Ufe5d> <Ufe50> <Ufe65> <U7f9> : "ᾣ" # U1fa3
-<Ufe5d> <Ufe51> <Ufe64> <U7c1> : "ᾌ" # U1f8c
-<Ufe5d> <Ufe51> <Ufe64> <U7c7> : "ᾜ" # U1f9c
-<Ufe5d> <Ufe51> <Ufe64> <U7d9> : "ᾬ" # U1fac
-<Ufe5d> <Ufe51> <Ufe64> <U7e1> : "ᾄ" # U1f84
-<Ufe5d> <Ufe51> <Ufe64> <U7e7> : "ᾔ" # U1f94
-<Ufe5d> <Ufe51> <Ufe64> <U7f9> : "ᾤ" # U1fa4
-<Ufe5d> <Ufe51> <Ufe65> <U7c1> : "ᾍ" # U1f8d
-<Ufe5d> <Ufe51> <Ufe65> <U7c7> : "ᾝ" # U1f9d
-<Ufe5d> <Ufe51> <Ufe65> <U7d9> : "ᾭ" # U1fad
-<Ufe5d> <Ufe51> <Ufe65> <U7e1> : "ᾅ" # U1f85
-<Ufe5d> <Ufe51> <Ufe65> <U7e7> : "ᾕ" # U1f95
-<Ufe5d> <Ufe51> <Ufe65> <U7f9> : "ᾥ" # U1fa5
-<Ufe5d> <Ufe53> <Ufe64> <U7c1> : "ᾎ" # U1f8e
-<Ufe5d> <Ufe53> <Ufe64> <U7c7> : "ᾞ" # U1f9e
-<Ufe5d> <Ufe53> <Ufe64> <U7d9> : "ᾮ" # U1fae
-<Ufe5d> <Ufe53> <Ufe64> <U7e1> : "ᾆ" # U1f86
-<Ufe5d> <Ufe53> <Ufe64> <U7e7> : "ᾖ" # U1f96
-<Ufe5d> <Ufe53> <Ufe64> <U7f9> : "ᾦ" # U1fa6
-<Ufe5d> <Ufe53> <Ufe65> <U7c1> : "ᾏ" # U1f8f
-<Ufe5d> <Ufe53> <Ufe65> <U7c7> : "ᾟ" # U1f9f
-<Ufe5d> <Ufe53> <Ufe65> <U7d9> : "ᾯ" # U1faf
-<Ufe5d> <Ufe53> <Ufe65> <U7e1> : "ᾇ" # U1f87
-<Ufe5d> <Ufe53> <Ufe65> <U7e7> : "ᾗ" # U1f97
-<Ufe5d> <Ufe53> <Ufe65> <U7f9> : "ᾧ" # U1fa7
 <Ufe5d> <Uff20> <U27> <U7e1> : "ᾴ" # U1fb4
 <Ufe5d> <Uff20> <U27> <U7e7> : "ῄ" # U1fc4
 <Ufe5d> <Uff20> <U27> <U7f9> : "ῴ" # U1ff4
 <Ufe63> <Ufe8c> <U72> : "ϼ" # U3fc
 <Ufe66> <U474> : "Ѷ" # U476
 <Ufe66> <U475> : "ѷ" # U477
-<Ufe66> <U6c1> : "а̏"
-<Ufe66> <U6c5> : "е̏"
-<Ufe66> <U6c9> : "и̏"
-<Ufe66> <U6cf> : "о̏"
-<Ufe66> <U6d2> : "р̏"
-<Ufe66> <U6d5> : "у̏"
-<Ufe66> <U6e1> : "А̏"
-<Ufe66> <U6e5> : "Е̏"
-<Ufe66> <U6e9> : "И̏"
-<Ufe66> <U6ef> : "О̏"
-<Ufe66> <U6f2> : "Р̏"
-<Ufe66> <U6f5> : "У̏"
 <Ufe67> <U7c> : "⫰" # U2af0
 <Ufe6a> <U2b> : "⨦" # U2a26
 <Ufe6c> <Ufe57> <U3d> : "⩷" # U2a77
index 5adb9caca4c695246ce83d304b856023d84426b3..dec41af467cf5df47b4cd9e4bb4017b6bde2394c 100644 (file)
@@ -341,7 +341,7 @@ match_algorithmic (void)
 
   ret = gtk_check_algorithmically (buffer, 3, output);
   g_assert_true (ret);
-  g_assert_cmpstr (output->str, ==, "á¼\87");
+  g_assert_cmpstr (output->str, ==, "á¾¶\xcc\x94");
 
   buffer[0] = GDK_KEY_dead_perispomeni;
   buffer[1] = GDK_KEY_dead_dasia;
@@ -379,7 +379,8 @@ match_algorithmic (void)
   buffer[2] = GDK_KEY_dead_grave;
 
   ret = gtk_check_algorithmically (buffer, 3, output);
-  g_assert_false (ret);
+  g_assert_true (ret);
+  g_assert_cmpstr (output->str, ==, "");
 
   buffer[0] = GDK_KEY_dead_diaeresis;
   buffer[1] = GDK_KEY_a;